#include <iostream>

using namespace std;

const int N = 100010;

int son[N][26], cnt[N], idx; //idx为记录下标，理解为第几层
char str[N];  //存输入

//插入数据
void insert(char str[]) {
	int p = 0;
	//遍历字符串
	for (int i = 0; str[i]; i++) {
		int a = str[i] - 'a';
		//如果有这个子节点，那么通过idx标记已存储，并且idx控制层数的递增
		if (!son[p][a]) son[p][a] = ++idx;
		p = son[p][a];
	}
 	//最后一个节点处加1，代表此字符串出现过1次
	cnt[p]++;
}

//查询数据

int query(char str[]) {
	int p = 0;
	//遍历树去查询
	for (int i = 0; str[i]; i++) {
		int a = str[i] - 'a';
		//如果中途字符串中的某个字符之前没有存储过那么就代表这个字符串没有出现过
		if (!son[p][a]) return 0;
		p = son[p][a];
	}
	//最后一个节点标记了几次，就代表这个字符串出现过几次
	return cnt[p];
}

int main() {
	int n = 0;
	//scanf("%d", &n);
	while (1) {
		char op[1];
		scanf("%s%s", op, str);
		if (op[0] == 'I') insert(str);
		else if (op[0] == 'Q') return 0;
		else printf("%s出现过%d次\n", str, query(str));
	}
	return 0;
}
